from django.shortcuts import render
from django.views import View
from apps.areas.models import Area
from django.http import JsonResponse
import logging
from django.core.cache import cache


# Create your views here.

# 创建日志记录器
logger = logging.getLogger('django')


class ProvinceAreasView(View):
    """获取所有省级地区的信息"""

    def get(self, request):
        """实现查询省份数据的逻辑"""
        # 读取缓存数据：cache.get('key')
        # 删除缓存数据：cache.delete('key')
        # 读取缓存:如果存在缓存,那后面的逻辑代码不执行
        province_dict_list = cache.get('province_dict_list')
        # 判断是否有缓存
        if not province_dict_list:
            try:
                # 查询省级数据: 省份数据没有父级
                # Area.objects.all() # 查询所有的省市区
                # Area.objects.get() # 只能查一个
                province_mode_list = Area.objects.filter(parent=None)

                # 将查询集模型列表转为字典列表
                province_dict_list = []
                for province_model in province_mode_list:
                    # 把模型数据转字典数据
                    province_dict = {
                        'id': province_model.id,
                        'name': province_model.name
                    }
                    province_dict_list.append(province_dict)

                # 存储缓存数据：cache.set('key', 内容, 有效期)
                # 添加缓存:缓存省份数据
                cache.set('province_dict_list', province_dict_list, 3600)
            except Exception as e:
                logger.error(e)
                # 如果报错, 则返回错误原因:
                return JsonResponse({'code': 400,
                                    'errmsg': '省份数据错误'})

        # 重要提示:JsonResponse()不识别模型数据(模型对象和查询集),只识别字典,列表,字典列表
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'province_list': province_dict_list
        })


class SubAreasView(View):
    """查询子级地区: 市和区县信息"""

    def get(self, request, parentid):
        """
        实现查询城市或者区县数据的逻辑
        :param request:
        :param parent_id: 省份ID, 城市ID
        :return: 城市数据, 区县数据
        说明: 如果parent_id是省份ID,那么查询城市数据,如果是城市ID,那么查询区县数据
        """
        # 读取缓存
        sub_data = cache.get('sub_data_%s' % parentid)
        # 判断是否存在缓存
        if sub_data:
            # 如果存在缓存
            return JsonResponse({
                'code': 0,
                'errmsg': 'ok',
                'sub_data': sub_data
            })

        # 查询当前的父级地区: 省份或者城市
        parent_area = Area.objects.get(id=parentid)
        # 查询当前父级地区的子级(一查多): 省份查城市, 城市查区县
        sub_model_list = parent_area.subs.all()

        # 将子级的模型列表转为字典列表
        subs = []
        for sub_model in sub_model_list:
            sub_dict = {
                'id': sub_model.id,
                'name': sub_model.name
            }
            subs.append(sub_dict)

        # 子级数据
        sub_data = {
            'id': parent_area.id,   # 父级ID
            'name': parent_area.name,   # 父级名字
            'subs': subs,   # 子级列表
        }

        # 添加缓存:城市区(县)
        # 说明:对于子级,我们需要区分当前缓存的是哪个父级的子级
        # 如果不做区分,数据就会被覆盖
        cache.set('sub_data_%s' % parentid, sub_data, 3600)

        # 响应结果
        return JsonResponse({
            'code': 0,
            'errmsg': 'ok',
            'sub_data': sub_data
        })
